package com.pm.common.security;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.multipart.support.MissingServletRequestPartException;

import com.pm.common.annotation.CurrentUser;
import com.pm.entity.po.security.User;

/**
 * 自定义参数解析器（解析user） 增加方法注入，将含有 @CurrentUser 注解的方法参数注入当前登录用户
 *  Title:
 * CurrentUserMethodArgumentResolver
 * 
 * @author WuJin
 * @date 2020年1月6日
 */

public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		return parameter.getParameterType().isAssignableFrom(User.class) // 判断是否能转换成User类型
				&& parameter.hasParameterAnnotation(CurrentUser.class); // 是否有CurrentUser注解
	}

	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
		User user = (User) webRequest.getAttribute("CurrentUser", RequestAttributes.SCOPE_REQUEST);
		if (user != null) {
			return user;
		}
		throw new MissingServletRequestPartException("CurrentUser");
	}
}